/**
 * 用法
 * 1、common
 * options.mode = 'common'
 * <select id="select" >
 * 		<option></option>
 *  		...
 * </select>
 * var select = $('#select').select(options);
 * 2、selectpicker
 * options.mode = 'selectpicker'
 * <div class="dropdown" id="div_menus">
 * 		<select class="selectpicker show-tick from-control" data-live-search="false">
 * 		</select>
 * </div>
 * var select = $('#div_menus').select(options)
 * 3、render
 * <div id="select">
 * 
 * </div>
 * var select = $('#select').select({
 * 		url:'',
 * 		idField:'id值',
 * 		valueField : '值',
 * 		textField : '展示文本值',
 * 		mode : 'render',
 * 		onRender : function(_this,data){
 * 			//渲染数据
 * 		},
 * 		onClear : function(_this){
 * 			//清空方法
 *		},
 * 		onClearAllSelect : function(_this){
 * 			//清空已选择
 * 		},
 * 		onSetValue : function(_this,value){
 * 			//设置值
 * 		},
 * 		onSetValues : function(_this,values){
 * 			//设置值
 * 		},
 * 		onGetValue : function(_this){
 * 			//获取值
 * 		},
 * 		onGetText : function(_this){
 * 			//获取文本值
 * 		}
 * });
 * 
 * var select = $('#select').select(options);
 * select('getValue');//获取值
 * select('getText');//获取文本
 * select('setValue','值');//设置选中值
 * select('setValues',['值1','值2']);//设置选中值
 * select('clear'); //清空下拉框
 * select('clearAllSelect');//清空已选择
 */
!(function($){
	
	var mode = {
		/**
		 * 一般的select
		 * 
		 */
		COMMON : 'common',
		/**
		 * bootstrap selectpicker
		 */
		SELECTPICKER : 'selectpicker',
		/**
		 * 自定义渲染
		 */
		RENDER : 'render'
	};
	/*
	 * 默认参数
	 */
	var defaults = {
		url : '',
		data : [] ,
		idField : 'ID',
		valueField : 'VALUE',
		textField : 'TEXT',
		mode:mode.COMMON,/*selectpicker*/
		requestParams : {
		}
	};
	/**
	 * 事件，可重载
	 */
	var method = {
		/**
		 * 首次渲染时调用
		 * @param {Object} selected
		 */
		onSelect : function(selected){
			console.log('-----onSelect-----');
			console.log(selected);
		},
		/**
		 * 选择变化时调用
		 * @param {Object} selected
		 */
		onChange : function(selected){
			console.log('-----onChange-----');
			console.log(selected);
		},
		/**
		 * 数据加载并渲染成功调用
		 * @param {Object} data
		 */
		onLoadSuccess:function(data){
			console.log('------onLoadSuccess------------');
		},
		
		/**
		 * 仅在自定义渲染调用
		 * @param {Object} _this
		 * @param {Object} data
		 */
		onRender:function(_this,data){
			
		},
		/**
		 * 清空,仅在自定义渲染
		 * @param {Object} _this
		 */
		onClear:function(_this){
			
		},
		/**
		 * 清空所有选择,仅在自定义渲染
		 * @param {Object} _this
		 */
		onClearAllSelect:function(_this){
			
		},
		/**
		 * 设置单个选择,仅在自定义渲染
		 * @param {Object} _this
		 * @param {Object} value
		 */
		onSetValue:function(_this,value){
			
		},
		/**
		 * 设置多个选择,仅在自定义渲染
		 * @param {Object} _this
		 * @param {Object} values
		 */
		onSetValues:function(_this,values){
			
		},
		/**
		 * 获取选择的值,仅在自定义渲染
		 * @param {Object} _this
		 */
		onGetValue :function(_this){
			
		},
		/**
		 * 获取选择的文本,仅在自定义渲染
]		 * @param {Object} _this
		 */
		onGetText :function(_this){
			
		}
	};
	
	/**
	 * 初始化
	 * @param {Object} opts
	 */
	function init(_this,opts){
		if(opts.url && typeof opts.url == 'string'){
			request(_this,opts);
		}else {
			render(_this, opts);
		}
	}
	
	/**
	 * 
	 * @param {String} url
	 * @param {Object} params
	 * @param {Function} callback
	 */
	function request(_this,opts){
		$.ajax({
			type:"post",
			url: opts.url,
			async:true,
			contentType:'application/json;charset=UTF-8',
			dataType:'json',
			data:JSON.stringify(opts.requestParams),
			success:function(result){
				opts.data = result;
				render(_this, opts);
			}
		});
	}
	
	/**
	 * 渲染
	 * @param {Object} _this
	 * @param {Object} opts
	 */
	function render(_this,opts){
		if(opts.data && $.isArray(opts.data)){
			/**
			 * 普通模式
			 */
			if(opts.mode == mode.COMMON){
				
				var html = "";
				if(opts.data.length == 1){
					select(opts,opts.data[1]);
				}
				$.each(opts.data,function(index,element){
					html += "<option value=\'"+element[opts.valueField]+"\' data-id = \'"+element[opts.idField]+"\'>"+element[opts.textField]+"</option>";	
				});
				_this.append(html);
			}/**
			  * bootstrap selectpicker
			  */
			else if(opts.mode == mode.SELECTPICKER){
				var div_menus_ul = _this.find('.inner');
				var html = "";
				$.each(opts.data,function(index,element){
					html += "<li data-original-index=\'"+element[opts.idField]+"\'>"
						 	+ "<a tabindex=\'"+element[opts.idField]+"\' data-tokens=\'null\'>"
						 		+ "<span class=\'text\'>"
									 + element[opts.textField]
						 		+ "</span>"
						 		+ "<span class='glyphicon glyphicon-ok check-mark'></span>"
							 + "</a>"
						 + "</li>";
				});
				div_menus_ul.append(html);
				var options = div_menus_ul.find('li');
				$.each(options,function(index){
					/**
					 * 绑定监听
					 */
					$(element).bind('click',function(){
						select(opts,opts.data[index]);
						changeText(_this);
					});
				});
				
			}
			/**
			 * 自定义渲染
			 */
			else if(opts.mode == mode.RENDER){
				opts.onRender(_this,opts.data);
			}
			/**
			 * 回调加载渲染成功
			 */
			opts.onLoadSuccess(opts.data);
		}
		
	}
	
	/**
	 * 选择
	 * @param {Object} selected
	 */
	function select(opts,selected){
		if(opts.mode == mode.COMMON){
			opts.onSelect(selected);
		}else if(opts.mode == mode.SELECTPICKER){
			if($(this).hasClass("selected")){
				$(this).removeClass('selected');
			}else{
				$(this).addClass('selected');
			}
			opts.onSelect(selected);
		}
	}
	
	/**
	 * 变化
	 */
	function change(opts,selected){
		opts.onChange(selected);
	}
	
	/**
	 * 在selectpicker状态下改变下拉框选择的文本
	 * @param {Object} _this
	 */
	function changeText(_this){
		var lis =  _this.find('.inner').children('li.selected');
		var button = _this.find('div:first-child').children('button');
		var span = $(button).find('.filter-option');
		var text = new Array();
		for(var i = 0;i < lis.length ;i++ ){
			text.push(lis[i].find('.text').text());
		}
		if(text.length == 0){
			span.attr('title','请选择');
			span.text('请选择');
		}else{
			text = text.toString();
			span.attr('title',text);
			span.text(text.length > 25 ? text.substring(0,25)+'...':text);
		}
	}
	
	/**
	 * 下拉框
	 * @param {Object} options
	 */
	$.fn.select = function(options){
		var _this = $(this);
		var opts = defaults;
		if(options){
			opts = $.extend({}, defaults,options,method);
			console.log(opts.mode);
		}
		//初始化
		init(_this,opts);
		/**
		 * 绑定onchange
		 */
		if(opts.mode == mode.COMMON){
			_this.bind('change',function(){
				change(opts,$(this).val());
			});
		}
		var methods = {
			/**
			 *获取值
			 */
			getValue : function(){
				if(opts.mode == mode.COMMON){
					return _this.val();
				}else if(opts.mode == mode.SELECTPICKER){
					var lis =  _this.find('.inner').children('li.selected');
					var ids = new Array();
					for(var i = 0;i < lis.length ;i++ ){
						ids.push($(lis[i]).attr('data-original-index'));
					}
					return ids.toString();
				}else if(opts.mode == mode.RENDER){
					opts.onGetValue(_this);
				}	
				return '';
			},
			/**
			 * 获取文本值
			 */
			getText : function(){
				if(opts.mode == mode.COMMON){
					var options = _this.find('option:selected');
					return options.text().toString();
				}else if(opts.mode == mode.SELECTPICKER){
					var button = _this.find('div:first-child').children('button');
					var span = $(button).find('.filter-option');
					return span.attr('title');
				}else if(opts.mode == mode.RENDER){
					opts.onGetText(_this);
				}	
				return '';
			},
			/**
			 * 清空选项
			 */
			clear : function(){
				if(opts.mode == mode.COMMON){
					_this.empty();
				}else if(opts.mode == mode.SELECTPICKER){
					_this.find('.inner').empty();
				}else if(opts.mode == mode.RENDER){
					opts.onClear(_this);
				}
			},
			/**
			 * 清空选择
			 */
			clearAllSelect : function(){
				if(opts.mode == mode.COMMON){
					_this.find('option:selected').prop('selected',false);
				}else if(opts.mode == mode.SELECTPICKER){
					_this.find('.inner li.selected').removeClass('selected');
					changeText(_this);
				}else if(opts.mode == mode.RENDER){
					opts.onClearAllSelect(_this);
				}
			},
			/**
			 * 设置选中的值
			 * @param {Object} value
			 */
			setValue : function(value){
				if(value && typeof value == 'string'){
					if(opts.mode == mode.COMMON){
						var options = _this.find('option');
						options.prop('selected',false);
						for(var j = 0;j < options.length ; j++ ){
							if(value == $(options[j]).attr('value')){
								$(options[j]).prop('selected',true);
								break;
							}
						}
					}else if(opts.mode == mode.SELECTPICKER){
						var lis = _this.find('.inner').children('li');
						$(lis).removeClass('selected');
						for(var j = 0;j < lis.length ; j++ ){
							if(value == $(lis[j]).attr('data-original-index')){
								$(lis[j]).addClass('selected');
								break;
							}
						}
						changeText(_this);
					}else if(opts.mode == mode.RENDER){
						opts.onSetValue(_this,value);
					}
				}
			},
			/**
			 * 设置多个选中的值
			 * @param {Array} values
			 */
			setValues : function(values){
				if(values&&$.isArray(values)){
					if(opts.mode == mode.COMMON){
						var options = _this.find('option');
						options.prop('selected',false);
						for(var i = 0;i < values.length;i++ ){
							for(var j = 0;j < options.length ; j++ ){
								if(values[i] == $(options[j]).attr('value')){
									$(options[j]).prop('selected',true);
									break;
								}
							}
						}
					}else if(opts.mode == mode.SELECTPICKER){
						var lis = _this.find('.inner').children('li');
						$(lis).removeClass('selected');
						for(var i = 0;i < values.length;i++ ){
							for(var j = 0;j < lis.length ; j++ ){
								if(values[i] == $(lis[j]).attr('data-original-index')){
									$(lis[j]).addClass('selected');
									break;
								}
							}
						}
						changeText(_this);
					}else if(opts.mode == mode.RENDER){
						opts.onSetValues(_this,values);
					}
				}

			}
		};
		return function(method,options){
			if(typeof method == 'string'){
					return methods[method](options);
			}else{
				return;
			}
		};
	};
	
})(jQuery);
